/**
 * 
 * MindBox 2009
 */
package com.mindbox.viajes.dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import com.mindbox.viajes.db.ConexionDAO;
import com.mindbox.viajes.dto.Ciudad;
import com.mindbox.viajes.dto.Pais;
import com.mindbox.viajes.exception.ExceptionBaseDatos;

/**
 * Clase para el acceso a datos de las ciudades. MindBox 2009
 * 
 * @author Julian
 * 
 */
public class DAOCiudad {

	/**
	 * Obtiene una lista de por pais ciudades. <b>NO CONSULTA LOS EVENTOS POR
	 * CIUDAD</b>.
	 * 
	 * @param pais
	 * @return
	 * @throws ExceptionBaseDatos
	 * @author Julian
	 */
	public ArrayList<Ciudad> getCiudadesPorPais(Pais pais)
			throws ExceptionBaseDatos {
		ArrayList<Ciudad> ciudades = new ArrayList<Ciudad>();
		ConexionDAO conexion = null;
		ResultSet rs = null;
		PreparedStatement ps = null;
		try {
			conexion = new ConexionDAO();
			String sql = "SELECT * FROM ciudad WHERE ciudad_pais_id = ?";

			ps = conexion.getPreparedStatement(sql);
			ps.setInt(1, Integer.parseInt(pais.getId()));
			rs = ps.executeQuery();

			while (rs.next()) {
				Ciudad ciudad = asignarDatosCiudad(rs);
				ciudad.setPais(pais);
				ciudades.add(ciudad);
			}
		} catch (Exception e) {
			String msg = "Error al consultar las ciudades";
			System.out.println(msg + ". Mensaje:" + e.getMessage());
			e.printStackTrace();
			throw new ExceptionBaseDatos(msg);
		} finally {
			conexion.cerrarFinal(rs);
			conexion.cerrarFinal(ps);
			if (conexion != null)
				try {
					conexion.cerrarCon();
				} catch (SQLException e) {
					String msg = "Error al cerrar la BD al consultar ciudades";
					System.out.println(msg + ". Mensaje:" + e.getMessage());
					e.printStackTrace();
				}
		}
		return ciudades;
	}
	
	/**
	 * Obtiene una lista ciudades
	 * @param pais
	 * @return
	 * @throws ExceptionBaseDatos
	 * @author Catalina Soto Zuluaga
	 */
	public ArrayList<Ciudad> getAllCiudades()
			throws ExceptionBaseDatos {
		ArrayList<Ciudad> ciudades = new ArrayList<Ciudad>();
		ConexionDAO conexion = null;
		ResultSet rs = null;
		PreparedStatement ps = null;
		try {
			conexion = new ConexionDAO();
			String sql = "SELECT * FROM ciudad";

			ps = conexion.getPreparedStatement(sql);
			rs = ps.executeQuery();

			while (rs.next()) {
				Ciudad ciudad = asignarDatosCiudad(rs);
				ciudades.add(ciudad);
			}
		} catch (Exception e) {
			String msg = "Error al consultar las ciudades";
			System.out.println(msg + ". Mensaje:" + e.getMessage());
			e.printStackTrace();
			throw new ExceptionBaseDatos(msg);
		} finally {
			conexion.cerrarFinal(rs);
			conexion.cerrarFinal(ps);
			if (conexion != null)
				try {
					conexion.cerrarCon();
				} catch (SQLException e) {
					String msg = "Error al cerrar la BD al consultar ciudades";
					System.out.println(msg + ". Mensaje:" + e.getMessage());
					e.printStackTrace();
				}
		}
		return ciudades;
	}

	/**
	 * Asigna los datos del ResultSet a un objeto Ciudad.
	 * 
	 * @param rs
	 * @return
	 * @throws SQLException
	 * @author Julian
	 */
	static Ciudad asignarDatosCiudad(ResultSet rs) throws SQLException {
		Ciudad ciudad = new Ciudad();
		ciudad.setId(rs.getString("ciudad_id"));
		ciudad.setNombre(rs.getString("ciudad_nombre"));
		ciudad.setCoordenada(rs.getString("ciudad_coordenada"));
		return ciudad;
	}
}